package com.frame.library.skin.support;

import android.content.Context;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;

import com.frame.library.skin.attr.SkinAttr;
import com.frame.library.skin.attr.SkinType;

import java.util.ArrayList;
import java.util.List;

/**
 * Added by Tom on 2024/07/02.
 * 皮肤属性解析 的支持类。
 */
public class SkinAttrSupport {
    private static final String TAG = "SkinAttrSupport";

    /**
     * 解析 获取SkinAttr的属性
     */
    public static List<SkinAttr> getSkinAttrs(Context context, AttributeSet attrs) {
        // 待解析内容: background  src  textColor  只关注这三个属性。
        ArrayList<SkinAttr> skinAttrs = new ArrayList<>();
        int attributeCount = attrs.getAttributeCount(); // 属性attrs的长度，属性的数量

        for (int index = 0; index < attributeCount; index++) {
            //获取attr的 名称和值
            String attrName = attrs.getAttributeName(index);
            String attrValue = attrs.getAttributeValue(index);
//            Log.d(TAG, "attrName--->" + attrName);
//            Log.d(TAG, "attrValue--->" + attrValue);

            // 只去获取需要的资源：textColor、res、background。
            SkinType skinType = getSkinType(attrName);
            if (skinType != null) { // skinType 非空才处理
                // 通过attrValue 获取资源的名称，用来换肤使用。是@int类型的
                String resName = getResName(context, attrValue);
                if (TextUtils.isEmpty(resName)) { // 不是以@开头的。不处理。
                    continue;
                }
                SkinAttr skinAttr = new SkinAttr(resName, skinType);
                skinAttrs.add(skinAttr); // 要处理的属性增加一个
            }
        }
        return skinAttrs;
    }

    /**
     * 获取资源名称：资源的id转名字
     *
     * @param context
     * @param attrValue
     * @return
     */
    private static String getResName(Context context, String attrValue) {
        // 只处理@符号开头的 attrValue。 其他的不处理，返回null。
        if (attrValue.startsWith("@")) { // attrValue--->@2131231085, attrValue--->-2, attrValue--->Hello World!, attrValue--->#FF00FF
            attrValue = attrValue.substring(1); // 去掉@符号
            int resId = Integer.parseInt(attrValue); // String 转int类型
            return context.getResources().getResourceEntryName(resId); // 通过resId，拿到资源名称
        }
        return null;
    }

    /**
     * 通过名称attrName 去获取SkinType
     *
     * @param attrName
     * @return
     */
    private static SkinType getSkinType(String attrName) {
        SkinType[] skinTypes = SkinType.values(); // 遍历枚举变量
        for (SkinType skinType : skinTypes) {
            if (skinType.getResName().equals(attrName)) { // 名称相等
                return skinType;
            }
        }
        return null;
    }

}
